AWS CloudFormationでEC2起動時にインスタンスメタデータサービスのバージョンをV2(IMDSv2)に指定する方法
こんにちは。まるとです。
Amazon EC2ではインスタンスのメタデータを取得できるインスタンスメタデータサービス(IMDS)というものがございます。
多くの場合、セキュリティの観点からメタデータ取得の際にトークンを必須とする、インスタンスメタデータサービスバージョン 2(IMDSv2)を利用されている方も多いのではないでしょうか。
今回、AWS CloudFormationでAmazon EC2 インスタンスを起動する際に、明示的にIMDSv2を設定しようとしてつまづいたので、自身のメモとして本記事を執筆します。
先に結論
AWS CloudFormationでAmazon EC2が利用するインスタンスメタデータサービスをバージョン2(IMDSv2)に設定するには、起動テンプレートを利用する必要があります。
ドキュメントを改めて読んでみよう
AWS CLIなどを利用する場合は、HttpTokens
というパラメータにrequired
を設定することでIMDSv2を指定できました。
AWS CloudFormationでも、AWS::EC2::Instanceに同様のパラメータを指定すれば良いのでは?と思う方(自分だけかもしれませんが)もいるかもしれませんが、ドキュメントを改めて読んでみると以下の記載があります。
AWS CloudFormation を使用してインスタンスのメタデータオプションを指定するには、「AWS CloudFormation ユーザーガイド」の「AWS::EC2::LaunchTemplate MetadataOptions」プロパティを参照してください。
上記の記載の通り、AWS CloudFormationでインスタンス起動時にIMDSv2を指定するには、一度起動テンプレートを作成してAWS::EC2::Instance
に紐づける必要があります。
では実際にAWS CloudFormationのテンプレートを書いてみましょう。
※下記テンプレートは分かりやすく説明するために、VPCなどの設定を省略しています。ご利用の際は、環境に合わせて適宜修正を行ってください。
AWSTemplateFormatVersion: 2010-09-09
Description: Set IMDSv2 to EC2 Instance
Resources:
# ------------------------------- #
# EC2
# ------------------------------- #
# Launch Template
EC2LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateName: SetIMDSv2
LaunchTemplateData:
MetadataOptions:
HttpTokens: required
# EC2 Instance
EC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
ImageId: ami-094dc5cf74289dfbc # Amazon Linux 2023
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: 0
SubnetId: subnet-xxxxxxxxxxxxxxxxx # Subnet ID
GroupSet:
- sg-xxxxxxxxxxxxxxxxx # Security Group ID
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeSize: 8
VolumeType: gp3
Encrypted: true
LaunchTemplate:
LaunchTemplateId: !Ref EC2LaunchTemplate
Version: !GetAtt EC2LaunchTemplate.LatestVersionNumber
Tags:
- Key: Name
Value: IMDSv2SampleInstance
ポイントは、まず起動テンプレートでHttpTokens: required
を設定します。
LaunchTemplateData:
MetadataOptions:
HttpTokens: required
その後、EC2 インスタンスに起動テンプレートを紐づける形に設定しています。
LaunchTemplate:
LaunchTemplateId: !Ref EC2LaunchTemplate
Version: !GetAtt EC2LaunchTemplate.LatestVersionNumber
起動テンプレートは、プロパティの記載がない場合、テンプレートに設定を含めないことができます。
これにより、IMDSv2を必須にしつつ、EC2 インスタンスのプロパティを細かく制御することができます。
以上でAWS CloudFormationにおいて、EC2 インスタンス起動時にIMDSv2を必須にすることができました。
まとめ
AWS マネジメントコンソールやAWS CLIでEC2 インスタンスを起動する際にバージョンを指定できるため、「AWS CloudFormationでもできるのでは?」と思ったところ、起動テンプレートを介して設定する必要があることが改めて確認できました。
今回はメモのような形になりますが、少しでもお役に立てれば幸いです。